/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import persistence.Cuenta;
import persistence.Movimiento;
import util.DateUtil;
import util.RMSUtil;

/**
 *
 * @author alfredo
 */
public class CuentaController {

    public Cuenta cuenta;

    public void create() {
        cuenta = new Cuenta();
    }

//    public void save() {
//        if (RMSUtil.getRecord(RMSUtil.registroCuenta, 1) == null) {
//            RMSUtil.addRecord(RMSUtil.registroCuenta, cuenta.toString());
//        } else {
//            RMSUtil.updateRecord(RMSUtil.registroCuenta, 1, cuenta.toString());
//        }
//    }
    public void addMovimiento(Movimiento m) {
        Cuenta uCuenta = getUltimaCuenta();
        int mes = DateUtil.getMes(m.getFecha());
        int anio = DateUtil.getAnio(m.getFecha());
        if (uCuenta != null) {
            if (uCuenta.getMes() == mes && uCuenta.getAnio() == anio) {
                // el movimiento se encuentra en el mes en curso
                uCuenta.setSaldo(uCuenta.getSaldo() + m.getMonto());
                if (m.getMonto() >= 0) {
                    uCuenta.setIngresos(uCuenta.getIngresos() + m.getMonto());
                } else {
                    uCuenta.setEgresos(uCuenta.getEgresos() + m.getMonto());
                }
                RMSUtil.updateRecord(RMSUtil.registroCuenta, uCuenta.getId(), uCuenta.toString());
            } else {
                if (mes < uCuenta.getMes()) {
                    //si es de un mes anterior al actual
                    Cuenta tempCuenta = uCuenta;
                    while (mes <= tempCuenta.getMes()) {
                        tempCuenta.setSaldo(tempCuenta.getSaldo() + m.getMonto());
                        if (mes == tempCuenta.getMes()) {
                            if (m.getMonto() >= 0) {
                                tempCuenta.setIngresos(tempCuenta.getIngresos() + m.getMonto());
                            } else {
                                tempCuenta.setEgresos(tempCuenta.getEgresos() + m.getMonto());
                            }
                        }
                        RMSUtil.updateRecord(RMSUtil.registroCuenta, tempCuenta.getId(), tempCuenta.toString());
                        if (mes == tempCuenta.getMes()) {
                            tempCuenta.setMes(tempCuenta.getMes() - 1);
                        } else {
                            tempCuenta.parse(RMSUtil.getRecord(RMSUtil.registroCuenta, tempCuenta.getId() - 1));
                        }
                    }
                } else {
                    //es de un nuevo mes, asi que añadir el registro
                    cuenta.setAnio(anio);
                    cuenta.setMes(mes);
                    cuenta.setSaldo(uCuenta.getSaldo() + m.getMonto());
                    if (m.getMonto() >= 0) {
                        cuenta.setIngresos(m.getMonto());
                        cuenta.setEgresos(0.0f);
                    } else {
                        cuenta.setIngresos(0.0f);
                        cuenta.setEgresos(m.getMonto());
                    }
                    RMSUtil.addRecord(RMSUtil.registroCuenta, cuenta.toString());
                }
            }
        } else {
            //es el primer de todos los registros
            cuenta.setAnio(anio);
            cuenta.setMes(mes);
            cuenta.setSaldo(m.getMonto());
            if (m.getMonto() >= 0) {
                cuenta.setIngresos(m.getMonto());
                cuenta.setEgresos(0.0f);
            } else {
                cuenta.setIngresos(0.0f);
                cuenta.setEgresos(m.getMonto());
            }
            RMSUtil.addRecord(RMSUtil.registroCuenta, cuenta.toString());
        }
    }

    private Cuenta getUltimaCuenta() {
        Cuenta ret = null;
        int id = RMSUtil.count(RMSUtil.registroCuenta);
        String rec = RMSUtil.getRecord(RMSUtil.registroCuenta, id);
        if (rec != null) {
            ret = new Cuenta();
            ret.parse(rec);
        }
        return ret;

    }

    public Cuenta[] list(int npagina, int cantidad) {
        Cuenta[] ret = null;
        String[] lista = RMSUtil.list(RMSUtil.registroCuenta, npagina, cantidad);
        if (lista != null) {
            ret = new Cuenta[lista.length];
            for (int i = 0; i < lista.length; i++) {
                Cuenta cc = new Cuenta();
                cc.parse(lista[i]);
                ret[i] = cc;
            }
        }
        return ret;
    }

    public void setCuenta(Cuenta cuenta) {
        this.cuenta = cuenta;
    }

    public Cuenta getCuenta() {
        return cuenta;
    }
}
